#include<iostream>

using namespace std ;

const int maxn = 100010 ;   //链表最大节点数

/**
 * head存放的是头结点指向的那个点的地址 ，e[i]存放的是当前这个节点的值 ， ne[i]存放的是当前这个结点的下一个结点位置
 * idx是标识现在分配到哪个结点了
 */
int head , e[maxn] , ne[maxn] , idx ;
int m ;

//初始化
void init() {
    head = -1 ;
    idx = 0 ;   //表示分配的结点地址从 0 号开始
}

//头插法
void add_to_head(int x) {
    e[idx] = x ;
    ne[idx] = head ;
    head = idx ;
    idx ++ ;
}

//在第 k 个结点的后面插入
void add(int k , int x ){
    e[idx] = x ;
    ne[idx] = ne[k] ;
    ne[k] = idx ;
    idx ++ ;
}

//删除第 k 个结点后面的结点
void remove(int k ) {
    ne[k] = ne[ne[k]] ;
}

int main() {

    init();
    cin >> m ;
    while(m--) {
        char op ;
        int k , x ;
        cin >> op ;
        switch(op){
            case 'H':
                scanf("%d" , &x) ;
                add_to_head(x);
                break;
            case 'D':
                scanf("%d" , &k);
                if (k == 0) {
                    head = ne[head] ;   //删除第一个结点
                }
                remove(k - 1);
                break;
            case 'I':
                scanf("%d%d" , &k , &x);
                add(k - 1, x); //0号点是第一个插入的点
                break;
        }
    }

    //遍历链表
    for(int i = head ; i != -1 ; i = ne[i]) {
        printf("%d " , e[i]);
    }

    return 0 ;
}